package com.company.基础.异常;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * 一异常的处理，抓抛模型
 * 过程一，“抛”，程序在正常执行过程中，一旦出现异常，就会在异常代码处生成一个对应异常类的对象
 * 过程二：“抓” 可以理解为异常处理方式
 *          ① try-catch-finally
 *          ② throws
 * 二 try -catch- finally的使用
 * try{
 *     //可能出现异常的代码
 *
 * }catch(异常类型1 变量名1){
 *     //处理异常的方式1
 * }catch(异常类型2 变量名2){
 *     //处理异常的方式2
 * }finally{
 *     //一定会执行的代码
 * }
 *
 * 说明：
 *  1.finally是可选的。
 *  2.使用try将可能出现的异常代码包装起来，在执行 过程中，一旦出现异常，就会生成一个对应的异常类的对像的类型，他catch中匹配
 *  3.一旦try中的异常对象匹配到某一个catch时，就进入catch中进入异常的处理，一旦处理完成，就跳出当前的try-catch结构
 *      (在没有写finally的情况)，继续执行其后的代码
 *  4.catch中的异常类型如果没有子父类关系，则谁声明在上，谁声明在下都无所谓
 *    catch中异常类型如果满足子父类关系，则要求子类一定要声明在父类上面，否则，报错
 *  5.常用的异常对象处理方式：①String getMessage() ②printStackTrace()
 *  6.在try结构中声明的变量，再出了try结构以后，就不能再被调用
 *
 *  体会，使用try-catch-finally处理编译时异常，是得程序在编译时就不再报错，但是运行时仍可能报错，相当于
 *  我们使用try-catch-finally将一个编译时可能出现的异常，延迟到运行时出现
 *
 */
public class ExceptionDemo1 {
    public static void main(String[] args) throws IOException {
        // ① try-catch-finally异常处理方式一
        String str="123";
        str="abc";
        try {
            int num=Integer.parseInt(str);
            System.out.println("hello------1");
        }catch (NumberFormatException e){
            System.out.println(e.getMessage());
        }catch (NullPointerException e){
            System.out.println("出现空指针异常了，不要着急。。。。。。。。。");
        }catch (Exception e){
            System.out.println("出现异常");
        }
        //@异常处理方式二   ② throws+异常类型
        method2();
    }

    private static void method2() throws IOException {
        File file=new File("hello.txt");
        FileInputStream fis=new FileInputStream(file);
        int data=fis.read();
        while (data!=-1){
            System.out.println((char)data);
            data=fis.read();
        }
        fis.close();
    }
}
